//配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
//引入路由的详细信息
import routes from '@/router/routes'
//使用插件
Vue.use(VueRouter);

import store from '@/store'
//先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.push;

//重写push|replace
//第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
//第二个参数：成功的回调
//第三个参数：失败的回调
//call|replace区别
//相同点们都可以调用函数，都可以篡改函数的上下文依次
//不痛点：call与apply传递参数：call传递参数用都好隔开 apply方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {

        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => {
        }, () => {
        })
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //call|replace区别
        //相同点们都可以调用函数，都可以篡改函数的上下文依次
        //不痛点：call与apply传递参数：call传递参数用都好隔开 apply方法执行，传递数组
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => {
        }, () => {
        })
    }
}

//配置路由
let router = new VueRouter({
    //配置路由
    routes,
    //滚动行为
    scrollBehavior() {
        // 返回的这个y=0,代表的滚动条在最上方
        return {y: 0}

    }
})
//全局守卫：前置守卫（再路由跳转之前进行判断）
router.beforeEach(async (to,from,next)=>{
    //to:可以获取到你要跳转到的路由信息
    //from:可以获取到你从那个路由而来的信息
    //next 放行函数   next()放行  next('/login')放行到指定路由  next(false)

    //用户登陆了，才会有token 未登录一定不会有token
    let token = store.state.user.token
    //用户信息
    let name = store.state.user.userInfo.name
    //已经登陆
    if(token) {
        //用户已经登陆了还想去login 给它进行限制【停留再首页】
        if(to.path === '/login'){
            next('/home')
        }else{
            //用户登陆了，去的不是login [home|search|detail|shopcart]  放行
            if(name){
                next()
            }else{
                //没有用户信息，派发action 让仓库存储用户信息再跳转
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                }catch (error) {
                    //token失效了获取不到用户信息，重新登录
                    //清除token
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
        }
    }else{
        //未登录 不能去交易相关、不能去支付相关【pay|success】、不能去个人中心
        //未登录去上面路由----登录
        let toPath = to.path
        if(toPath.indexOf('/trade') !==-1 || toPath.indexOf('/pay')!==-1 || toPath.indexOf('/center')!==-1){
            //把未登录的时候去而没去成的信息，存储在地址栏中【路由】
            next('/login?redirect='+toPath)
        }else{
            //去的不是这些路由（home|search|shopCart）---放行
            next()
        }
    }
})



export default router